import SqliteHelper from "@/sqlite/SqliteHelper";
import type { DatabaseParams } from "react-native-sqlite-storage";
import type { TableFieldsOption } from "@anlib/sqlite-orm/lib/types";

// 分片文件数据
const databaseParams: DatabaseParams = {
  name: "slice_file.db",
  location: "default"
};

// 本地保存的字段数据, 具体类型见下面 TagPoolItemType 定义
const fields: TableFieldsOption[] = [
  { field: "id", type: "INTEGER", isKey: true },

  { field: "url", type: "TEXT" },
  { field: "method", type: "TEXT" },
  { field: "headers", type: "TEXT" },
  { field: "originFileSize", type: "INTEGER" },
  { field: "targetDir", type: "TEXT" },
  { field: "rangeSize", type: "INTEGER" },
  { field: "targetFilePath", type: "TEXT" },
  { field: "startRange", type: "INTEGER" },
  { field: "endRange", type: "INTEGER" },
  { field: "rangeCountSum", type: "INTEGER" },
  { field: "currentCount", type: "INTEGER" },
  { field: "error", type: "TEXT" },
  { field: "downloadFilePath", type: "TEXT" },
  { field: "downTime", type: "TEXT" },
];

// 初始化 sqlite
let sqlh: SqliteHelper | null = null;
const initSqlite = (): Promise<SqliteHelper> => {
  return new Promise((resolve, reject) => {
    const instance = new SqliteHelper(databaseParams, fields, 1);

    // 初始化
    instance
      .init()
      .then(res => {
        if (res instanceof SqliteHelper) {
          sqlh = res;
          resolve(sqlh);
        } else {
          reject(res);
        }
      })
      .catch(err => {
        reject(err);
      });
  });
};

// 关闭数据库
const closeSqlite = () => {
  if (sqlh) {
    sqlh.close();
    sqlh = null;
  }
};

// 定义sqling 数据的 ts 类型
type SliceFileSqliteType = {
  /** 数据库ID */
  id: number;

  /** 下载的url */
	url: string;

	/** 下载方法 */
	method: "GET" | "POST";

	/** 下载请求头 */
	headers: string; // 数据库存 JSON 格式

	/** 文件源大小 */
	originFileSize: number;

	/** 切片文件下载到那个目录 */
	targetDir: string;

	/** 文件分片大小 */
	rangeSize: number;

	/** 分片文件下载路径 */
	targetFilePath: string;

	/** 开始切片范围 */
	startRange: number;

	/** 结束切片范围 */
	endRange: number;

	/** 切片数量 */
	rangeCountSum: number;

	/** 第几次下载 */
	currentCount: number;

	/** 错误信息 */
	error: string;

	/** 完整文件下载到那个路径 */
	downloadFilePath: string;

	/** 下载时间 */
	downTime: string;
};

export { sqlh, initSqlite, closeSqlite, type SliceFileSqliteType };
